package com.wugh.fast.module.mapper;


import tk.mybatis.mapper.weekend.Fn;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author 吴冠辉
 * @date 2018/2/2
 */
public interface FnEnhanceMapper<T> {
    /**
     * 根据指定属性统计数量
     *
     * @param propertyGetter 属性名
     * @param value          属性值
     * @return
     */
    <V, R> int selectCountByProperty(Fn<T, R> propertyGetter, V value);

    /**
     * 根据指定属性统计数量
     *
     * @param propertyGetter 属性名
     * @param values         属性值集合
     * @return
     */
    <V, R> int selectCountByProperty(Fn<T, R> propertyGetter, Collection<V> values);

    /**
     * 根据指定属性查询单个结果
     *
     * @param propertyGetter 属性名
     * @param value          属性值
     * @return
     */
    <V, R> T selectOneByProperty(Fn<T, R> propertyGetter, V value);

    /**
     * 根据指定属性查询数据
     *
     * @param propertyGetter 属性名
     * @param value          属性值
     * @return
     */
    <V, R> List<T> selectByProperty(Fn<T, R> propertyGetter, V value);

    /**
     * 根据指定属性查询数据
     *
     * @param propertyGetter 属性名
     * @param values         属性值集合
     * @return
     */
    <V, R> List<T> selectByProperty(Fn<T, R> propertyGetter, Collection<V> values);

    /**
     * 根据指定属性删除数据
     *
     * @param propertyGetter 属性名
     * @param value          属性值
     * @return
     */
    <V, R> int deleteByProperty(Fn<T, R> propertyGetter, V value);

    /**
     * 根据指定属性删除数据
     *
     * @param propertyGetter 属性名
     * @param values         属性值集合
     * @return
     */
    <V, R> int deleteByProperty(Fn<T, R> propertyGetter, Collection<V> values);

    /**
     * 根据指定属性查询数据,并转化成Map集合
     *
     * @param propertyGetter 属性名
     * @param value          属性值
     * @return
     */
    <K, V> Map<K, T> mapByProperty(Fn<T, K> propertyGetter, V value);

    /**
     * 根据指定属性查询数据,并转化成Map集合
     *
     * @param propertyGetter 属性名
     * @param value          属性值
     * @param keyGetter      key属性名,默认为主键
     * @return
     */
    <K, V, R> Map<K, T> mapByProperty(Fn<T, R> propertyGetter, V value, Fn<T, K> keyGetter);

    /**
     * 根据指定属性查询数据,并转化成Map集合
     *
     * @param propertyGetter 属性名
     * @param values         属性集合
     * @return
     */
    <K, V> Map<K, T> mapByProperty(Fn<T, K> propertyGetter, Collection<V> values);

    /**
     * 根据指定属性查询数据,并转化成Map集合
     *
     * @param propertyGetter 属性名
     * @param values         属性集合
     * @param keyGetter      key属性名,默认为主键
     * @return
     */
    <K, V, R> Map<K, T> mapByProperty(Fn<T, R> propertyGetter, Collection<V> values, Fn<T, K> keyGetter);

    /**
     * 根据Example查询数据,并转化成Map集合
     *
     * @param example   Example搜索条件
     * @param keyGetter key属性名,默认为主键
     * @return
     */
    <K> Map<K, T> mapByExample(Object example, Fn<T, K> keyGetter);

    /**
     * 根据主键集合查询数据,并分组转化成Map集合
     *
     * @param values    主键集合
     * @param keyGetter 分组的属性名
     * @return
     */
    <K, V> Map<K, List<T>> groupMapByPrimarykey(Collection<V> values, Fn<T, K> keyGetter);

    /**
     * 根据指定属性查询数据,并分组转化成Map集合
     *
     * @param propertyGetter 属性名
     * @param value          属性值
     * @return
     */
    <K, V> Map<K, List<T>> groupMapByProperty(Fn<T, K> propertyGetter, V value);

    /**
     * 根据指定属性查询数据,并分组转化成Map集合
     *
     * @param propertyGetter 属性名
     * @param value          属性值
     * @param keyGetter      分组的属性名,缺省值为查询的属性名
     * @return
     */
    <K, V, R> Map<K, List<T>> groupMapByProperty(Fn<T, R> propertyGetter, V value, Fn<T, K> keyGetter);

    /**
     * 根据指定属性查询数据,并分组转化成Map集合
     *
     * @param propertyGetter 属性名
     * @param values         属性值集合
     * @return
     */
    <K, V> Map<K, List<T>> groupMapByProperty(Fn<T, K> propertyGetter, Collection<V> values);

    /**
     * 根据指定属性查询数据,并分组转化成Map集合
     *
     * @param propertyGetter 属性名
     * @param values         属性值集合
     * @param keyGetter      分组的属性名,缺省值为查询的属性名
     * @return
     */
    <K, V, R> Map<K, List<T>> groupMapByProperty(Fn<T, R> propertyGetter, Collection<V> values, Fn<T, K> keyGetter);

    /**
     * 根据Example查询数据,并分组转化成Map集合
     *
     * @param example   Example搜索条件
     * @param keyGetter 分组的属性名
     * @return
     */
    <K> Map<K, List<T>> groupMapByExample(Object example, Fn<T, K> keyGetter);
}
